package controller.commoncontroller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import model.editormodel.EditorModel;
import model.editormodel.ErrorMessage;
import model.editormodel.ErrorMessage.ErrorType;

/**
 * <b>Implementiert:</b> <code>ActionListener</code> <br>
 * <b>In Verbindung stehende Klassen:</b> <code>EditorModel</code><br>
 * <br>
 * Zugehoerige Controllerklasse zum ViewElement CheckButton und dem Menueeintrag
 * <i>Auf Fehler ueberpruefen</i>. Diese Klasse stoesst den Start der Checks
 * fuer eine Schaltung an.
 * 
 * @author Team Locsi
 * 
 */
public class CheckListener implements ActionListener {

	private EditorModel eModel;

	/**
	 * Dieser Konstruktor erzeugt ein neues <code>CheckListener</code>-Objekt.
	 * 
	 * @param eModel
	 *            <code>EditorModel</code> - Referenz auf das
	 *            <code>EditorModel</code>.
	 */
	public CheckListener(EditorModel eModel) {
		this.eModel = eModel;
		this.eModel.getChecker().addObserver(new CheckObserver());
	}

	/**
	 * Hier wird mit Hilfe des <code>EditorModel</code>-Objekts der Start der
	 * Checks fuer die Schaltung angestossen.
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		UtilityDialogs.showCheckDialog(e, eModel);
		eModel.getChecker().startCheckThread();
	}

	/**
	 * Mit Hilfe dieses Observers werden Informationen von der Check-Klasse
	 * ausgewertet, die bei jedem Durchlauf der Checks an dessen Observer
	 * gesendet werden
	 * 
	 * @author Team Locsi
	 * 
	 */
	public class CheckObserver implements Observer {

		/**
		 * Diese Methode reagiert in Abhaengigkeit von dem uebergebenen
		 * ErrorMessage Type, welcher JDialog ausgeloest wird
		 */
		@Override
		public void update(Observable arg0, Object arg1) {
			if (arg1 instanceof ErrorMessage) {
				ErrorType eType = ((ErrorMessage) arg1).getErrorType();

				// Anhand des Typs der ErrorMessage wird entschieden, welche
				// Methode in der Klasse UtilityDialogs aufgerufen wird, bzw.
				// welches JDialog fuer den Benutzer erzeugt werden soll
				switch (eType) {

				case EMPTY_CIRCUIT:
					UtilityDialogs.circuitIsNotEmpty(false);
					break;

				case NO_EMPTY_CIRCUIT:
					UtilityDialogs.circuitIsNotEmpty(true);
					break;

				case MISSING_INPUT_CONNECTION:
					UtilityDialogs.inputsCheck(false);
					break;

				case INPUT_CHECK_OKAY:
					UtilityDialogs.inputsCheck(true);
					break;

				case MISSING_SWITCH_CLOCK:
					UtilityDialogs.subnetCheck(false);
					UtilityDialogs.disposeCheckDialog();
					break;

				case SUBNET_CHECK_OKAY:
					UtilityDialogs.subnetCheck(true);
					UtilityDialogs.disposeCheckDialog();
					break;

				default:
					break;
				}
			}
		}
	}
}